﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
using System.Drawing;

namespace GestionEco
{
    public abstract class EtreVivant
	{
        public const int POINT_BOIRE = 2;
        public const int POINT_MANGER = 4;
        public const int POINT_SEREPRODUIRE = 6;
        public const int POINT_DEPLACER = 6;

        protected string nomEtre;
        protected Image imageEtre;
        protected Texture2D texture;
        protected Coordonnee lesCoordDeEtreVivant;
        protected List<String> typeTerrain;
        protected int vieMax;
        protected int vieActuelle;
        protected int attaque;
        protected int esquive;
        protected int degats;
        protected int vue;
        protected int age;
        protected int regen;
        protected int faimMax;
        protected int faimActuelle;
        protected int coeffFaim;
        protected int soifMax;
        protected int soifActuelle;
        protected int coeffSoif;
        protected int pointsActionActuels;
        protected int ageMax;
        protected int majorite;
        protected int nbTourReprod;
        protected bool sexe; //true -> male , false -> femelle



        public EtreVivant(bool s, int uneVieMax, int uneAttaque, int uneEsquive, int desDegats, int uneVue, int uneRegen, int uneFaimMax, int unCoeffFaim, int uneSoifMax, int unCoeffSoif, int desPointsActionActuels, int unAgeMax, int uneMajorite, int unNbTourReprod, string n, Image img, List<String> unTypeTerrain)
        {
            this.lesCoordDeEtreVivant = new Coordonnee();
            this.nomEtre = n;
            this.imageEtre = img;
            this.age = 0;
            this.typeTerrain = unTypeTerrain;
            this.vieMax = uneVieMax;
            this.attaque = uneAttaque;
            this.esquive = uneEsquive;
            this.degats = desDegats;
            this.vue = uneVue;
            this.regen = uneRegen;
            this.faimMax = uneFaimMax;
            this.coeffFaim = unCoeffFaim;
            this.soifMax = uneSoifMax;
            this.coeffSoif = unCoeffSoif;
            this.pointsActionActuels = desPointsActionActuels;
            this.ageMax = unAgeMax;
            this.majorite = uneMajorite;
            this.nbTourReprod = unNbTourReprod;
            this.sexe = s;
            this.vieActuelle = vieMax;
            this.faimActuelle = this.faimMax;
            this.soifActuelle = this.soifMax;         
        }

        
        #region assesseurs

        public string NomEtre
        {
            get { return nomEtre; }
            set { nomEtre = value; }
        }

        public Image ImageEtre
        {
            get { return imageEtre; }
            set { imageEtre = value; }
        }

        public Texture2D Texture
        {
            get { return texture; }
            set { texture = value; }
        }

        public Coordonnee LesCoordDeEtreVivant
        {
            get { return lesCoordDeEtreVivant; }
            set { lesCoordDeEtreVivant = value; }
        }

        public List<String> TypeTerrain
        {
            get { return typeTerrain; }
            set { typeTerrain = value; }
        }

        public int VieMax
        {
            get { return vieMax; }
            set { vieMax = value; }
        }

        public int VieActuelle
        {
            get { return vieActuelle; }
            set { vieActuelle = value; }
        }

        public int Attaque
        {
            get { return attaque; }
            set { attaque = value; }
        }

        public int Degats
        {
            get { return degats; }
            set { degats = value; }
        }

        public int Majorite
        {
            get { return majorite; }
            set { majorite = value; }
        }

        public int Esquive
        {
            get { return esquive; }
            set { esquive = value; }
        }

        public int Vue
        {
            get { return vue; }
            set { vue = value; }
        }

        public int Age
        {
            get { return age; }
            set { age = value; }
        }

        public int Regen
        {
            get { return regen; }
            set { regen = value; }
        }

        public int FaimActuelle
        {
            get { return faimActuelle; }
            set { faimActuelle = value; }
        }

        public int FaimMax
        {
            get { return faimMax; }
            set { faimMax = value; }
        }

        public int SoifMax
        {
            get { return soifMax; }
            set { soifMax = value; }
        }

        public int SoifActuelle
        {
            get { return soifActuelle; }
            set { soifActuelle = value; }
        }

        public int PointsActionActuels
        {
            get { return pointsActionActuels; }
            set { pointsActionActuels = value; }
        }

        public bool Sexe
        {
            get { return sexe; }
            set { sexe = value; }
        }

        public int NbTourReprod
        {
            get { return nbTourReprod; }
            set { nbTourReprod = value; }
        }

        public int AgeMax
        {
            get { return ageMax; }
            set { ageMax = value; }
        }

        public int CoeffSoif
        {
            get { return coeffSoif; }
            set { coeffSoif = value; }
        }

        public int CoeffFaim
        {
            get { return coeffFaim; }
            set { coeffFaim = value; }
        }
        #endregion

        //methode pour savoir si un etre vivant peut effectuer une action
        public virtual bool retraitPoints(int nb)
        {
            if (this.PointsActionActuels >= nb)
            {
                this.PointsActionActuels -= nb;
                return true;
            }
            else
            {
                return false;
            }
        }

        public virtual void seDeplacer()
        {
            if (!retraitPoints(POINT_DEPLACER))
            {
                Console.WriteLine("Plus de points pour se deplacer");
            }
        }

        public virtual void vieillir()
        {
            // on ajoute 1 a l'age de l'animal
            this.Age += 1;
        }

        public virtual void boire(int quantite)
        {
            if (!retraitPoints(POINT_BOIRE))
            {
                Console.WriteLine("Plus de points pour boire");
            }
            else
            {
                if (quantite >= (this.SoifMax - this.soifActuelle))
                {
                    this.SoifActuelle = this.SoifMax;
                }
                else
                {
                    this.SoifActuelle += quantite;
                }
            }         
        }      

        public String affichageConsole()
        {
            return (" nomEtre : " + nomEtre + " vieMax : " + vieMax.ToString() + " vieActuelle : " + vieActuelle.ToString() + " faimMax : " + faimMax.ToString() + " faimActuelle : " + faimActuelle.ToString() + " soifMax : " + soifMax.ToString() + " soifActuelle : " + soifActuelle.ToString());
        }

        //Pour les animaux (herbivores et carnivores) seNourrir(la proie)
        public virtual void seNourrir(EtreVivant e)
        {
           
        }

        //Nourris l'attaquant suivant un nombre de points de dégats infligé
        public virtual void nourrir(int ptsNourrir)
        {
        }
        public virtual void seRegenerer(){}
        public abstract EtreVivant seReproduire(EtreVivant e);
    }
}
